#include "Socios.h"


int Socios :: h (long int ced){
    return ced%B;
}

void Socios :: crearLista (Nodo * &sos){
    sos = NULL;
}

void Socios :: destruirLista (Nodo * &sos){
Nodo * aux = sos;
    while (aux != NULL){
        sos = aux->sig;
        delete (aux);
        aux = sos;
    }
    sos = aux;
}

bool Socios :: perteneceLista (Nodo * sos, long int ced){
bool encontre= false;
    while(sos!=NULL&&!encontre){
        if(sos->info->getCedula()==ced)
            encontre=true;
        sos=sos->sig;
    }
    return encontre;
}

void Socios :: insFrontEnLista (Nodo * &sos, Socio * socio){
Nodo * aux = new Nodo;
    aux->info = socio;
    aux->sig = sos;
    sos = aux;
}

Socio * Socios :: obtenerEnLista (Nodo * sos, long int ced){
    while(sos->info->getCedula()!=ced)
        sos=sos->sig;
    return sos->info;
}

void Socios :: cargarIterador(Nodo * sos, Iterador * &Iter){
    while(sos!=NULL){
        Iter->insertar (sos->info);
        sos=sos->sig;
    }
}

float Socios :: recaudacionEnLista (Nodo * sos, float aran){
float rec=0.0;
    while(sos!=NULL){
        rec=rec+(sos->info) -> calculaTicket(aran);
        sos=sos->sig;
    }
    return rec;
}

void Socios :: becadoMayorEnLista (Nodo * sos,long int &ced, Fecha &mayor, bool &habia){
    while(sos!=NULL){
        if(sos->info->tipoSocio()=="Becado"||sos->info->tipoSocio()=="Especial"){
            if(!habia){
                habia=true;
                mayor=((Becado *) sos->info) -> getFechaVto();
                ced=sos->info->getCedula();
            }else{
                if(mayor<((Becado *) sos->info) -> getFechaVto()){
                    mayor=((Becado *) sos->info) -> getFechaVto();
                    ced=sos->info->getCedula();
                }
            }
        }
        sos=sos->sig;
    }
}

Socios :: Socios(){
int i;
    for(i=0;i<B;i++)
        crearLista(Hash[i]);
}

void Socios :: insert(Socio * socio){
    int clave = socio->getCedula();
    int cubeta = h(clave);
    insFrontEnLista(Hash[cubeta],socio);
}

bool Socios :: member(long int ced){
    int cubeta = h(ced);
    return perteneceLista(Hash[cubeta],ced);
}

Socio * Socios :: find(long int ced){
    int cubeta = h(ced);
    return obtenerEnLista(Hash[cubeta],ced);
}

Iterador * Socios :: listadoSocios(){
int i;
Iterador * Iter=new Iterador;
    for(i=0;i<B;i++)
        cargarIterador (Hash[i], Iter);
    return Iter;
}

float Socios :: recaudacion(float aran){
int i;
float recau=0.0;
    for(i=0;i<B;i++)
        recau=recau + recaudacionEnLista(Hash[i],aran);
    return recau;
}

void Socios :: becadoMayorVencimiento(Socio * &becado, bool &habia){
int i;
long int ced;
Fecha mayor;
habia=false;

    for(i=0;i<B;i++)
        becadoMayorEnLista(Hash[i],ced, mayor,habia);

    if(habia)
        becado=find(ced);

}

Socios :: ~Socios(){
}
